`timescale 1ns / 1ps
`include "const.v"
module AT(
    input [31:0] instr,
    output reg[4:0] A1,
    output reg[4:0] A2,
    output reg[4:0] A3,
    output reg[1:0] Tu1,
    output reg[1:0] Tu2,
    output reg[1:0] Tn,
    output reg isRI
    );


    always @(*)begin
        case(instr[`OP])
            `R: begin
                case(instr[`FUNCT])
                    `ADDU: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SUBU: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `ADD: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SUB: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SLT: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SLTU: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `AND: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `OR: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `XOR: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `NOR: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SLLV: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SRLV: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SRAV: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SLL: begin
                    isRI <= 0;
                       A1 <= 0; Tu1 <= 0;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SRL: begin
                    isRI <= 0;
                       A1 <= 0; Tu1 <= 0;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `SRA: begin
                    isRI <= 0;
                       A1 <= 0; Tu1 <= 0;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `MULT: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= 0; Tn <= 0;
                    end
                    `MULTU: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= 0; Tn <= 0;
                    end
                    `DIV: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= 0; Tn <= 0;
                    end
                    `DIVU: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= instr[`RT]; Tu2 <= 1;
                        A3 <= 0; Tn <= 0;
                    end
                    `JR: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 0;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= 0; Tn <= 0;
                    end
                    `JALR: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 0;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= instr[`RD]; Tn <= 0;
                    end
                    `MFHI: begin
                    isRI <= 0;
                       A1 <= 0; Tu1 <= 0;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `MFLO: begin
                    isRI <= 0;
                       A1 <= 0; Tu1 <= 0;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= instr[`RD]; Tn <= 1;
                    end
                    `MTHI: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= 0; Tn <= 0;
                    end
                    `MTLO: begin
                    isRI <= 0;
                       A1 <= instr[`RS]; Tu1 <= 1;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= 0; Tn <= 0;
                    end
                    default: begin
                    isRI <= 1;
                        A1 <= 0; Tu1 <= 0;
                        A2 <= 0; Tu2 <= 0;
                        A3 <= 0; Tn <= 0;
                    end
                endcase
            end
            `ORI: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `ADDI: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `ADDIU: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `ANDI: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `XORI: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `SLTI: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `SLTIU: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 1;
            end
            `LW: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 2;
            end
            `LB: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 2;
            end
            `LBU: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 2;
            end
            `LH: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 2;
            end
            `LHU: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT]; Tn <= 2;
            end
            `SW: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= instr[`RT]; Tu2 <= 2;
                A3 <= 0; Tn <= 0;
            end
            `SB: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= instr[`RT]; Tu2 <= 2;
                A3 <= 0; Tn <= 0;
            end
            `SH: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 1;
                A2 <= instr[`RT]; Tu2 <= 2;
                A3 <= 0; Tn <= 0;
            end
            `BEQ: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 0;
                A2 <= instr[`RT]; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
            `BNE: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 0;
                A2 <= instr[`RT]; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
            `BLEZ: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
            `BGTZ: begin
                    isRI <= 0;
               A1 <= instr[`RS]; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
            `BLTZ: begin // BGEZ
                A1 <= instr[`RS]; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
            `LUI: begin
                    isRI <= 0;
               A1 <= 0; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= instr[`RT];  Tn <= 0;
            end
            `J: begin
                    isRI <= 0;
               A1 <= 0; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
            `JAL: begin
                    isRI <= 0;
               A1 <= 0; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= 5'b11111; Tn <= 0;
            end
            `COP0:begin
                if(instr[`RS]==`MTC0)begin
                        isRI <= 0;
                    A1 <= 0; Tu1 <= 0;
                    A2 <= instr[`RT]; Tu2 <= 2;
                    A3 <= 0; Tn <= 0;
                end
                else if(instr[`RS]==`MFC0)begin
                        isRI <= 0;
                    A1 <= 0; Tu1 <= 0;
                    A2 <= 0; Tu2 <= 0;
                    A3 <= instr[`RT]; Tn <= 2;
                end
                else if(instr[`FUNCT]==`ERET)begin
                        isRI <= 0;
                    A1 <= 0; Tu1 <= 0;
                    A2 <= 0; Tu2 <= 0;
                    A3 <= 0; Tn <= 0;
                end
                else begin
                        isRI <= 1;
                    A1 <= 0; Tu1 <= 0;
                    A2 <= 0; Tu2 <= 0;
                    A3 <= 0; Tn <= 0;
                end
            end
            default: begin
                    isRI <= 1;
                A1 <= 0; Tu1 <= 0;
                A2 <= 0; Tu2 <= 0;
                A3 <= 0; Tn <= 0;
            end
        endcase
    end
endmodule
